package leetcode;

/**
 * 53.最大子序和
 *
 * <p>
 * 给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
 * <p>
 * 示例:
 * <p>
 * 输入: [-2,1,-3,4,-1,2,1,-5,4]
 * 输出: 6
 * 解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。
 * <p>
 * <p>
 * 普通，动态规划
 */
public class MaxSubArray {

    /**
     * 动态规划 推荐
     * <p>
     * pd[i] 表示 已i为结尾的最大连续数组的和
     * pd[i] = max(pd[i-1]+nums[i],nums[i])
     *
     * @param nums
     * @return
     */
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        int curMax = 0;
        for (int cur: nums){
            curMax = Math.max(curMax+cur,cur);
            max = Math.max(curMax,max);
        }
        return max;
    }

    /**
     * 普通解法
     *
     * @param nums
     * @return
     */
    public int maxSubArray1(int[] nums) {
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            int temp = nums[i];

            if (i == 0) {
                max = temp;
            } else {
                if (temp > max) {
                    max = temp;
                }
            }

            if (i == nums.length - 1) {
                break;
            }
            for (int j = i + 1; j < nums.length; j++) {
                temp = temp + nums[j];
                if (temp > max) {
                    max = temp;
                }
            }
        }
        return max;
    }
}
